<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="keywords" content="shell, bash, Linux, 程序设计">
        <meta name="description" content="Shell 程序设计教程">
        <meta name="author" content="Huoty">
        <title>Shell 脚本调试方法和文件包含 | Shell 程序设计教程</title>
        <link rel="shortcut icon" href="imgs/favicon.ico" type="image/x-icon" />
        <link rel="stylesheet" href="css/style.css" type="text/css">

        <!-- 实现 Github 风格的语法高亮 -->
        <link href="css/github.min.css" rel="stylesheet"/>
        <script src="js/highlight.min.js"></script>
        <script>
            hljs.initHighlightingOnLoad();
        </script>
        <script src="js/MathJax.js" type="text/javascript"></script>
        <script type="text/javascript">
            MathJax.Hub.Config({"showProcessingMessages" : false,"messageStyle" : "none","tex2jax": { inlineMath: [ [ "$", "$" ] ] }});
        </script>
    </head>
 <body>
  <!-- 页面头部 -->
  <div class="header"> 
    <h1 id="shell">Shell 程序设计教程</h1>
  </div>
  <div class="topnav">
    <p>
        «&#160;&#160;<a href="chapter6.html">Shell 自定义函数</a>
        &#160;&#160;::&#160;&#160;
        <a class="uplink" href="index.html">首页</a>
        &#160;&#160;::&#160;&#160;
        <a href="exercises.html">思考与实践</a>&#160;&#160;»
    </p>
  </div>
  
  <!-- 页面主体 -->
  <div class="midbody">
  <h2 id="shell">
   Shell 脚本调试方法和文件包含
  </h2>
  <p>
   本部分介绍一些并不常用但也比较重要的内容。这里首先介绍 Shell 脚本的调试方法、文件包含以及简单的图形界面编程等内容，之后如果有新的内容，会在这里添加。
  </p>
  <h3 id="shell_1">
   Shell 脚本调试方法
  </h3>
  <p>
   在编写shell脚本时，shell提供了一些用于调试的选项：
  </p>
  <div class="hblock"><pre>
-n    读一遍脚本的命令但不执行，用于检查脚本中的错误。
-v    一遍执行脚本，一遍将执行过的脚本命令打印到标准错误输出。
-x    提供跟踪执行信息，将执行的每一条命令和结果一次打印出来。
</pre></div>
  <p>
   使用这些选项有三种方法：
   <br/>
   （1）在命令行提供参数：
  </p>
  <blockquote>
   <p>
    sh -x /script.sh
   </p>
  </blockquote>
  <p>
   （2）在脚本开头提供参数：
  </p>
  <blockquote>
    #! /bin/bash -x
  </blockquote>
  <p>
   （3）在脚本中用 set 命令启用或禁用参数
  </p>
  <pre><code>#！/bin/bash 

if [ -z "$1" ]; then
  set -x
  echo "ERROR: Insufficient Args."
  exit 1
  set +x
fi
</code></pre>
  <p>
   set -x 和 set +x 分别表示启用和禁用 -x 参数，这样可以只对脚本中的某一段进行跟踪调试。
  </p>
  <h3 id="shell_2">
   Shell 文件包含
  </h3>
  <p>
   像其他语言一样，Shell 也可以包含外部脚本，即将外部脚本的内容合并到当前脚本。其包含脚本的方法有两种，即
   <code>
    “.”
   </code>
   和
   <code>
    “source”
   </code>
   ：
  </p>
  <blockquote>
   <p>
    . filename
   </p>
  </blockquote>
  <p>
   或
  </p>
  <blockquote>
   <p>
    source filename
   </p>
  </blockquote>
  <p>
   例如先创建一个名为 subscript.sh 的脚本，然后再在其他脚本中包含它：
  </p>
  <pre><code># filename：subscript.sh

url="http://kuanghy.github.io/"
</code></pre>
  <p>
   主脚本如下：
  </p>
  <pre><code>#!/bin/bash

# Filename: 
# Author: huoty &lt;sudohuoty@163.com&gt;
# Script starts from here:

. ./subscript.sh
echo $url
</code></pre>
  <p>
   被包含脚本不需要有执行权限，只保持主脚本有执行权限即可。其实这种文件包含的内容在之前的内容中我们已经提到过，只不过不是用来解决文件包含的问题。之前我们谈到过，Shell 在执行脚本时是另外开启一个子进程来执行的，所以想要让脚本的内容在当前 shell 中执行，则需要用 “.” 或 “source” 来执行脚本。其实这这两者的含义是一样的，所谓的让脚本内容在当前 shell 执行，也就是将脚本文件的内容包含到当前 shell 来执行，其实质都是文件包含。
  </p>
  <h3 id="shell_3">
   Shell 图形界面编程
  </h3>
  <p>
   在 Shell 编程中，有一个工具可以提供简单的图形界面编程实现，即
   <code>
    zenity
   </code>
   。Zenity 只能提供一些简单的对话框，其实际是基于GTK+的一个对话框工具。。Zenity 主要对话框的列表包括日历、输入、报错、消息、文件选择、清单、通知、进展、问题、警告、比例和文字信息。
  </p>
  </div> <!-- end midbody-->

  <div class="bottomnav">
        <p>
        «&#160;&#160;<a href="chapter6.html">Shell 自定义函数</a>
        &#160;&#160;::&#160;&#160;
        <a class="uplink" href="index.html">首页</a>
        &#160;&#160;::&#160;&#160;
        <a href="exercises.html">思考与实践</a>&#160;&#160;»
        </p>
  </div>

  <div class="footer">
    Copyright &copy; 2015 <a href="http://kuanghy.github.io/about/">Huoty</a>,
    Created using <a href="">Github</a>, Version 0.1
  </div>
 </body>
</html>